阅读指南
前面几节讨论了ChatGPT如何计算概率、预测下一个词。但有一个根本性问题还没有解答:计算机只能处理数字,文字是如何参与计算的?本节将看到向量如何用于语言,让语言变成可以运算的数学对象。
一方面,人类的语言是符号系统:
"猫"、"cat"、"猫咪"
这些都是符号,本身没有数值意义,只是人类约定俗成的代表一种动物的记号。
Transformer是数值计算系统:
输入:数字 → 计算 → 输出:数字
它只能做加减乘除,不能直接处理"猫"这个字。如何让Transformer处理语言?
第一次尝试:One-Hot编码
最直观的想法是给每个词分配一个编号。假设词表只有5个词:
猫、狗、喜欢、吃、鱼
用One-Hot编码,每个词用一个5维向量表示,只有对应位置是1,其余都是0:
词表 向量表示
─────────────────────────────
猫 = [1, 0, 0, 0, 0] ← 第1位是1
狗 = [0, 1, 0, 0, 0] ← 第2位是1
喜欢 = [0, 0, 1, 0, 0] ← 第3位是1
吃 = [0, 0, 0, 1, 0] ← 第4位是1
鱼 = [0, 0, 0, 0, 1] ← 第5位是1
文字变成了数字,可以交给Transformer处理。但这个方法有严重的问题。
1. 维度灾难
例子中只有5个词,需要5维向量。GPT-3的词表有约50000个token,意味着每个词需要一个50000维的向量,其中49999个是0,只有1个是1,极其浪费。
2. 丢失语义信息
这种编码方式把所有词看作完全独立、没有关系的个体。计算两个向量的相似度(余弦相似度,详见本节补充说明):
词对 相似度计算 结果
──────────────────────────────────────────────
(猫, 狗) [1,0,0,0,0] · [0,1,0,0,0] = 0
(猫, 鱼) [1,0,0,0,0] · [0,0,0,0,1] = 0
(猫, 吃) [1,0,0,0,0] · [0,0,0,1,0] = 0
所有词之间的相似度都是0。"猫"和"狗"都是动物,应该有相似性。One-Hot编码把词变成了数字,但丢失了词的"意义"。
类似给每个人分配一个身份证号,号码确实能区分人,但无法反映"这两个人是兄弟"、"那两个人是大学同学"这些信息。
2013年,Google研究员Tomas Mikolov提出了Word2Vec。
"Embedding"的字面意思是"嵌入",就像把宝石嵌入戒指,这里把高维的词符号"嵌入"到低维的向量空间里。核心思想很简单:
不要用稀疏的、高维的、孤立的向量表示词,而是用稠密的、低维的、充满语义的向量表示词。
从50000维降到12288维
不用One-Hot的50000维,而是把每个词表示成12288维的向量(GPT-3的实际选择)。这12288个数字不是只有1个1其余都是0,而是每个位置都有意义:
猫 = [0.2, -0.5, 0.7, 0.1, -0.3, ..., 0.4] ← 12288个小数
这12288个数字共同编码了"猫"的多维语义:它是一种动物(生物属性)、有四条腿(形态特征)、常常和"鱼"一起出现(共现关系)、会"喜欢"、"抓"、"睡觉"(行为特征)。
这就是Embedding:把高维稀疏的符号,嵌入到低维稠密的向量空间里。
One-Hot就像身份证号
假设用身份证号来表示一个人:
人物 身份证号
──────────────────────────
张三 110101199001010001
李四 110101199002020002
王五 110101199003030003
这些号码确实能区分不同的人,但无法从号码看出张三和李四是兄弟、李四和王五是同事、张三和王五有相似的爱好。
Embedding就像DNA
不用身份证号,而是用一个"特征向量"来表示一个人:
特征 身高 体重 智商 情商 运动 艺术
─────────────────────────────────────────────────
张三 175 70 120 85 6 3
李四 173 68 118 88 7 2 ← 和张三很相似
王五 165 60 95 120 3 9 ← 完全不同的类型
现在可以计算相似度了。One-Hot只能区分,不能比较。Embedding既能区分,又能比较,还能计算相似度。
这些特征不是人工设定的,而是自动学习出来的。模型在训练过程中,自动发现哪些维度对预测下一个词最有用,然后把词的语义"压缩"到这些维度里。
基于统计学习的方法(如Embedding)之所以有效,正是因为让模型自己从数据中学习语义表示,而非人工设定规则。
现在知道了Embedding如何解决One-Hot的问题:用低维稠密向量替代高维稀疏向量。但这些向量有什么神奇的性质?它们是怎么学会语义的?
下一节将看到,词向量竟然能做代数运算:"国王 - 男人 + 女人 = 女王"。
| 中文 | English | 音标 | 说明 |
|---|---|---|---|
| 嵌入 | Embedding | /ɪmˈbedɪŋ/ | 将高维稀疏的符号映射到低维稠密向量空间的技术 |
| 独热编码 | One-Hot Encoding | /wʌn hɒt ɪnˈkəʊdɪŋ/ | 每个词用一个只有一位为1其余为0的向量表示的编码方式 |
| 词表 | Vocabulary | /vəˈkæbjʊleri/ | 模型能处理的所有Token的集合 |
| 向量 | Vector | /ˈvektər/ | 一组有序的数字,用于表示词在语义空间中的位置 |
| 语义空间 | Semantic Space | /sɪˈmæntɪk speɪs/ | 词向量分布的高维空间,语义相近的词在空间中距离近 |
| 维度灾难 | Curse of Dimensionality | /kɜːrs əv daɪˌmenʃəˈnæləti/ | 高维向量导致计算和存储开销剧增的问题 |
| 余弦相似度 | Cosine Similarity | /ˈkoʊsaɪn ˌsɪməˈlærəti/ | 衡量两个向量方向相近程度的指标,值域[-1,1] |